package com.example.demo.utils;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** 
* @ClassName: PhoneNumberMasker 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author majie
* @date 2024年12月20日  
*/
public class PhoneNumberMasker {

    private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("\\d{11}");
    private static final Pattern PHONE_NUMBER_TWELVE_PATTERN = Pattern.compile("\\d{12}");

    /**
     * 将字符串中的所有11位手机号中间四位替换为*
     *
     * @param input 包含手机号的原始字符串
     * @return 处理后的字符串
     */
    public static String maskPhoneNumbersInString(String input) {
        if (input == null) {
            return null;
        }

        Matcher matcher12 = PHONE_NUMBER_TWELVE_PATTERN.matcher(input);
        StringBuffer filter = new StringBuffer();

        while (matcher12.find()) {
        	filter.append(matcher12.group()).append(",");
        }
        
        Matcher matcher = PHONE_NUMBER_PATTERN.matcher(input);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            String phoneNumber = matcher.group();
            if(filter.toString().contains(phoneNumber)) continue;
            String maskedPhoneNumber = maskPhoneNumber(phoneNumber);
            matcher.appendReplacement(result, maskedPhoneNumber);
        }
        matcher.appendTail(result);

        return result.toString();
    }

    /**
     * 将单个11位手机号中间四位替换为*
     *
     * @param phoneNumber 原始手机号，要求为11位数字
     * @return 模糊化处理后的手机号
     */
    private static String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.length() != 11) {
            throw new IllegalArgumentException("Invalid phone number. It must be exactly 11 digits.");
        }

        // 使用StringBuilder提高性能
        StringBuilder maskedNumber = new StringBuilder(phoneNumber);
        for (int i = 3; i < 7; i++) {
            maskedNumber.setCharAt(i, '*');
        }
        return maskedNumber.toString();
    }

    public static void main(String[] args) {
        String textWithPhoneNumbers = "联系人电话：13800138000和1390013900022，请尽快联系他们。";
        System.out.println(maskPhoneNumbersInString(textWithPhoneNumbers));
        // 输出: 联系人电话：138****8000 和 139****9000，请尽快联系他们。
        
        String mm = "请核实是否符合《电信用户申诉处理办法》（中华人民共和国工业和信息化部令第35号）相关要求姓名代鑫邮政编码工作单位联系电话19112584865电子邮箱被申诉企业中国移动申诉内容 11";
        System.out.println(maskPhoneNumbersInString(mm));
        
    }
    
}
